李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

Crontab 相关

Table of Contents

1. 基础用法

详细用法用 man crontab 查看。

crontab -l 列出当前用户的所有任务。

执行 crontab -e 可以进入任务编辑模式。

编辑模式下会有一些注释来解释用户需要写些什么东西,读完注释基本就会写了。命令调度的时间精度只能到分钟级别。

Crontab 的日志要用 sudo journalctl -u cron.service 来看。日志不由 rsyslog 管理。

要注意的地方:

  1. 新创建的 cron job,不会马上执行,至少要过 2 分钟才执行。如果重启 cron 则马上将新任务加入计时器中。
  2. 每个任务执行完毕之后,系统会自动将输出发送邮件给当前系统用户,占很多硬盘空间。可以在每个命令后加 >/dev/null 2>&1 让输出重定向到空文件,这样就没有信息可发送了。
  3. crontab 中的 % 有特殊含义,表示换行。要用的话必须转义 \% ,如 date 命令在写格式参数时要写成 date '+\%Y\%m\%d'
  4. 更新系统时间或时区后需要重启 cron。

2. 日志问题

在有 systemd 套件的系统上,journalctl 是日志管理组件。

cron 日志不由 syslog 管理,若有需要可以在 /etc/rsyslog.conf 文件或者 /etc/rsyslog.d 路径下的文件里手动配置:

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          -/var/log/mail.log
user.*                          -/var/log/user.log

取消相应注释后 sudo systemctl restart rsyslog 重启日志服务即可。

3. 环境变量问题

cat /etc/crontab 可以看到,它在执行脚本时默认使用 /bin/sh 而不是 /bin/bash ,环境变量也只有 PATH 一个。

这意味着所有默认针对 bash 的配置 ( 比如 /etc/profile ) 在这里都不起作用。所以有些脚本在 bash 的命令行可以执行,但是用 cron 定时执行就会报错。

首先,可以在脚本里用到的路径写成绝对路径,不用环境变量的路径值。

第二,在脚本的开头手动导入环境变量:

#!/bin/sh

. /etc/profile
. ~/.bash_profile

第三,在 crontab 执行任务之前手动添加环境变量。比如:

0 * * * * . /etc/profile; /bin/bash ~/job.sh


Last Update: 2023-08-13 Sun 14:24

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议